package com.dc.java8._5_dateTime;

import org.junit.Test;

import java.time.*;
import java.time.format.DateTimeFormatter;
import java.util.Set;

/**
 * Description: 日期时间 Demo
 * @author: gdc
 * @date: 2021/4/10
 * @version 1.0
 */
public class DateTimeTest {

	/**
	 * LocalDate、LocalTime、LocalDateTime
	 */
	@Test
	public void test1() {
		// 获取当前的 日期和时间
		LocalDateTime dt1 = LocalDateTime.now();
		System.out.println(dt1);
		System.out.println("-------------------------------------");

		// 获取当前的 日期
		LocalDate dt2 = LocalDate.now();
		System.out.println(dt2);
		System.out.println("-------------------------------------");

		// 获取当前的 时间
		LocalTime dt3 = LocalTime.now();
		System.out.println(dt3);
		System.out.println("-------------------------------------");

		// 指定 日期时间
		LocalDateTime dt4 = LocalDateTime.of(2018, 5, 1, 12, 14, 30);
		System.out.println(dt4);
		System.out.println("-------------------------------------");
		
		System.out.println("年：" + dt4.getYear());
		System.out.println("月：" + dt4.getMonthValue());			// 4
		//System.out.println("英文月：" + dt4.getMonth());			// MAY
		System.out.println("日：" + dt4.getDayOfMonth());
		System.out.println("时：" + dt4.getHour());
		System.out.println("分：" + dt4.getMinute());
		System.out.println("秒：" + dt4.getSecond());
		System.out.println(dt2 + ",是否为闰年：" + dt2.isLeapYear());
	}

	/**
	 * Instant : 时间戳。 （使用 Unix 元年  1970年1月1日 00:00:00 所经历的毫秒值）
	 */
	@Test
	public void test2() {
		//默认使用 UTC 时区
		Instant ins = Instant.now();
		System.out.println(ins);
		
		OffsetDateTime odt = ins.atOffset(ZoneOffset.ofHours(8));
		System.out.println(odt);
		
		System.out.println(ins.getNano());
		
		Instant ins2 = Instant.ofEpochSecond(5);
		System.out.println(ins2);
	}

	/**
	 * Duration : 	用于计算两个“时间”间隔
	 * Period : 	用于计算两个“日期”间隔
	 */
	@Test
	public void test3(){
		Instant ins1 = Instant.now();
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		Instant ins2 = Instant.now();
		System.out.printf("日期：%s 与 %s，之间相差 %s 时间 %n", ins1, ins2, Duration.between(ins1, ins2));
		
		LocalDate ld1 = LocalDate.now();
		LocalDate ld2 = LocalDate.of(2020, 1, 1);
		
		Period pe = Period.between(ld1, ld2);
		System.out.printf("日期：%s 与 %s，之间相差 %s 年 %n", ld1, ld2, pe.getYears());
		System.out.printf("日期：%s 与 %s，之间相差 %s 月 %n", ld1, ld2, pe.getMonths());
		System.out.printf("日期：%s 与 %s，之间相差 %s 日 %n", ld1, ld2, pe.getDays());
	}

	/**
	 * TemporalAdjuster : 时间校正器
	 */
	@Test
	public void test4() {
		LocalDateTime dt1 = LocalDateTime.now();
		System.out.println(dt1);
		LocalDateTime dt2 = dt1.withDayOfMonth(10);
		System.out.println(dt2);
		
		// 自定义下一个工作日
		LocalDateTime dt4 = dt1.with(l -> {
			LocalDateTime dt3 = (LocalDateTime) l;
			DayOfWeek dow = dt3.getDayOfWeek();
			if (dow.equals(DayOfWeek.FRIDAY)) {
				return dt3.plusDays(3);
			} else if (dow.equals(DayOfWeek.SATURDAY)) {
				return dt3.plusDays(2);
			} else {
				return dt3.plusDays(1);
			}
		} );
		System.out.println(dt4);

		LocalDateTime dt5 = dt4.plusYears(1);					// 添加年
		LocalDateTime dt6 = dt5.plusMonths(2);					// 添加月
		LocalDateTime dt7 = dt6.plusDays(3);					// 添加日
		LocalDateTime dt8 = dt7.plusHours(4);					// 添加时
		LocalDateTime dt9 = dt8.plusMinutes(5);					// 添加分
		LocalDateTime dt10 = dt9.plusSeconds(6);				// 添加秒
		LocalDateTime dt11 = dt10.plusNanos(7);					// 添加纳秒
		LocalDateTime dt12 = dt11.plusWeeks(8);					// 添加星期
		System.out.println("+1年：" + dt5);
		System.out.println("+2月：" + dt6);
		System.out.println("+3日：" + dt7);
		System.out.println("+4时：" + dt8);
		System.out.println("+5分：" + dt9);
		System.out.println("+6秒：" + dt10);
		System.out.println("+7纳秒：" + dt11);
		System.out.println("+8周：" + dt12);
	}

	/**
	 * DateTimeFormatter : 解析和格式化日期或时间
	 */
	@Test
	public void test5() {
		//DateTimeFormatter dtf = DateTimeFormatter.ISO_LOCAL_TIME;
		DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
		LocalDateTime dt = LocalDateTime.now();
		System.out.println("原日期时间为：" + dt);
		String strDate = dt.format(dtf);
		System.out.println("格式化后的日期时间为：" + strDate);
		
		LocalDateTime newDt = LocalDateTime.parse(strDate, dtf);
		System.out.println("解析后的日期时间为：" + newDt);
	}

	@Test
	public void test6() {
		Set<String> set = ZoneId.getAvailableZoneIds();
		set.forEach(System.out::println);
	}

	/**
	 * ZonedDate、ZonedTime、ZonedDateTime ： 带时区的时间或日期
	 */
	@Test
	public void test7() {
		LocalDateTime ldt = LocalDateTime.now(ZoneId.of("Asia/Shanghai"));
		System.out.println(ldt);
		ZonedDateTime zdt = ZonedDateTime.now(ZoneId.of("US/Pacific"));
		System.out.println(zdt);
	}

}
